
package cn.zlg.common.datadump.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import cn.zlg.common.datadump.convertor.FieldValueConvert;
import cn.zlg.common.datadump.enums.DataDumpErrorProcessType;
import cn.zlg.common.datadump.enums.MultiRefEntityChooseStrategy;

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataDumpField {

    // Class entity();

    String field();

    Class<? extends FieldValueConvert>[] importConvertors() default {};

    /**
     * 转换器准备的参数
     *
     * @return
     */
    String[] importConvertorParams() default {};

    Class<? extends FieldValueConvert>[] exportConvertors() default {};

    /**
     * 导入时，确定实体唯一性的列
     *
     * @return
     */
    boolean importKey() default false;

    /**
     * 导入时忽略本字段
     *
     * @return
     */
    boolean importIgnore() default false;

    /**
     * 转换器准备的参数
     *
     * @return
     */
    String[] exportConvertorParams() default {};

    /**
     * 如果从关联实体取数据，是否和主表join。用于提高查询效率
     *
     * @return
     */
    boolean useJoin() default false;

    Class referenceEntity() default Object.class;

    String referenceEntityField() default "";

    String referenceEntityIdField() default "id";

    /**
     * 遇到错误的处理方式:<br>
     * 1. 忽略本字段<br>
     * 2. 忽略本行<br>
     * 3. 终止处理程序
     *
     * @return
     */
    DataDumpErrorProcessType errorProcess() default DataDumpErrorProcessType.IGNORE_FIELD;

    /**
     * 关联实体不存在时，是否创建
     *
     * @return
     */
    boolean createRefEntityWhenNotExists() default false;

    /**
     * 导入时，关联实体存在多个时的处理策略
     *
     * @return
     */
    MultiRefEntityChooseStrategy multiRefEntityChooseStragey() default MultiRefEntityChooseStrategy.ABORT;

    /**
     * 导入时，关联对象不存在的错误消息
     *
     * @return
     */
    String refEntityNotExistsMessage() default "";

    /**
     * 是否塞入关联实体
     *
     * @return
     */
    boolean needSetOtherEntity() default false;

}
